package com.sap.sap_mangers.controller;

import com.sap.sap_mangers.Vo.MessageBoardVo.MessageBoardCommentVo;
import com.sap.sap_mangers.dto.message_board.MessageBoardArticle;
import com.sap.sap_mangers.dto.message_board.MessageBoardPraise;
import com.sap.sap_mangers.service.MessageBoardService;
import com.sap.sap_mangers.until.ConstantUntil;
import com.sap.sap_mangers.until.JwtUtil;
import com.sap.sap_mangers.until.SimpleJson;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author 谢添
 * 2022/8/19 16:16
 */
@RestController
@RequestMapping("/messageBoard")
public class MessageBoardController {
    @Resource
    private MessageBoardService messageBoardService;

    /**
     * 用户创建留言板文章
     *
     * @param article 文章信息
     * @return 情况
     */
    @PostMapping("/createArticle")
    @PreAuthorize("hasAuthority('正式成员')")
    public SimpleJson createArticle(@RequestBody MessageBoardArticle article) {
        article.setUserId(JwtUtil.getUserForToken());
        return messageBoardService.createArticle(article);
    }

    /**
     * 用户修改文章
     *
     * @param article 文章内容
     * @return 文章的全部具体信息
     */
    @PutMapping("/updateArticle")
    @PreAuthorize("hasAuthority('正式成员')")
    public SimpleJson updateArticle(@RequestBody MessageBoardArticle article) {
        try {
            article.setUserId(JwtUtil.getUserForToken());
            return messageBoardService.updateArticle(article);
        } catch (Exception e) {
            return new SimpleJson(5, "无效操作：" + e.getClass().toString(), null);
        }
    }

    /**
     * 创建一条评论
     *
     * @param messageBoardCommentVo 评论内容
     * @return 文章的全部具体信息
     */
    @PostMapping("/createComment")
    @PreAuthorize("hasAuthority('正式成员')")
    public SimpleJson createComment(@RequestBody MessageBoardCommentVo messageBoardCommentVo) {
        try {
            messageBoardCommentVo.setUserId(JwtUtil.getUserForToken());
            return messageBoardService.createComment(messageBoardCommentVo);
        } catch (Exception e) {
            return new SimpleJson(5, "评论失败，错误信息：" + e.getMessage());
        }
    }

    /**
     * 删除自己的某条评论
     *
     * @param messageBoardCommentVo 文章id，评论id
     * @return 文章的全部具体信息
     */
    @DeleteMapping("/delComment")
    @PreAuthorize("hasAuthority('正式成员')")
    public SimpleJson delComment(@RequestBody MessageBoardCommentVo messageBoardCommentVo) {
        try {
            messageBoardCommentVo.setUserId(JwtUtil.getUserForToken());
            return messageBoardService.delComment(messageBoardCommentVo);
        } catch (Exception e) {
            return new SimpleJson(5, "删除失败，错误信息：" + e.getMessage());
        }
    }

    /**
     * 用户获取自己 / 别人的全部文章
     *
     * @return 用户的全部文章
     */
    @GetMapping("/getUserAllArticle")
    @PreAuthorize("hasAuthority('正式成员')")
    public SimpleJson getUserAllArticle(@RequestParam(value = "userId", required = false) Integer userId) {
        return messageBoardService.getUserAllArticleByUserId(userId == null ? Integer.parseInt(JwtUtil.getUserForToken()) : userId);
    }

    /**
     * 用户删除自己的某篇文章
     *
     * @return 自己的全部文章
     */
    @DeleteMapping("/delUserArticle")
    @PreAuthorize("hasAuthority('正式成员')")
    public SimpleJson delUserArticle(@RequestParam("articleId") Integer articleId) {
        Integer userId = Integer.parseInt(JwtUtil.getUserForToken());
        try {
            messageBoardService.delArticleByArticleIdAndUserId(articleId, userId);
        } catch (Exception e) {
            return new SimpleJson(5, "错误信息：" + e.getMessage(), null);
        }
        return messageBoardService.getUserAllArticleByUserId(userId);
    }

    /**
     * 点赞 或 取消点赞
     *
     * @param articleId 文章id
     * @return 第一个值是 当前点赞状态 ， 第二个值 是 当前文章的总点赞数
     */
    @PostMapping("/createOrUpdatePraiseStatus")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson createOrUpdatePraiseStatus(@RequestParam("articleId") Integer articleId) {
        try {
            Integer userId = Integer.parseInt(JwtUtil.getUserForToken());
            Integer praiseId = messageBoardService.createOrUpdatePraiseStatus(articleId, userId);
            List<Integer> message = messageBoardService.getPraiseStatusAndLenOfArticle(articleId, userId);
            if (praiseId != null) {
                message.add(praiseId);
            }
            return new SimpleJson(1, "操作成功", message);
        } catch (Exception e) {
            return new SimpleJson(5, "错误信息：" + e.getMessage());
        }
    }

    /**
     * 获取对于当前用户来说未查看的新文章数量
     *
     * @return 新文章数量
     */
    @GetMapping("/getNewNoViewArticleCounts")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson getNewNoViewArticleCounts() {
        return messageBoardService.getNewNoViewArticleCounts(Integer.parseInt(JwtUtil.getUserForToken()));
    }

    /**
     * 修改用户最后一次访问留言板的时间为当前时间
     *
     * @return 修改状态
     */
    @PutMapping("/updateViewBoardLastTime")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson updateViewBoardLastTime() {
        messageBoardService.updateViewBoardLastTime(Integer.parseInt(JwtUtil.getUserForToken()));
        return new SimpleJson(0, "最后一次访问留言板时间修改成功");
    }

    /**
     * 修改用户最后一次访问留言板消息栏的时间为当前时间
     *
     * @return 修改状态
     */
    @PutMapping("/updateViewNewsLastTime")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson updateViewNewsLastTime() {
        messageBoardService.updateViewNewsLastTime(Integer.parseInt(JwtUtil.getUserForToken()));
        return new SimpleJson(0, "最后一次访问消息栏时间修改成功");
    }

    /**
     * 在按照时间排序的文章列表中获取到小于articleId的共limitNumber个数据
     *
     * @param articleId 文章id
     * @return 数据信息
     */
    @GetMapping("/getArticlesForLimitNumberByArticleId")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson getArticlesForLimitNumberByArticleId(@RequestParam(value = "currentShowMinArticleId", required = false) Integer articleId) {
        return messageBoardService.
                getArticlesForLimitNumberByArticleId(articleId, ConstantUntil.LIMIT_NUMBER_OF_MESSAGE_BOARD);
    }

    @GetMapping("/getLastTimeViewBoardAndNews")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson getLastTimeViewBoardAndNews() {
        return messageBoardService.getLastTimeViewBoardAndNews(Integer.parseInt(JwtUtil.getUserForToken()));
    }

    /**
     * 获取对于该userId的留言板消息栏的新消息的数量，新消息的概念等价于微信朋友圈(无是否为好友的区分)
     *
     * @return 新消息数量
     */
    @GetMapping("/getNoViewNewsNumberForUser")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson getNoViewNewsNumberForUser() {
        return messageBoardService.getNoViewNewsNumberForUser(Integer.parseInt(JwtUtil.getUserForToken()));
    }

    /**
     * 返回有线的消息数
     *
     * @param newsId 当前最小的消息id
     * @return 消息数据
     */
    @GetMapping("/getNewsForLimitNumber")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson getNewsForLimitNumber(@RequestParam(value = "currentShowMinNewsId", required = false) Integer newsId) {
        return messageBoardService.getNewsForLimitNumber(
                Integer.parseInt(JwtUtil.getUserForToken()),
                ConstantUntil.LIMIT_NUMBER_OF_BOARD_NEWS,
                newsId
        );
    }

    /**
     * 获取某篇文章的详细信息
     *
     * @param articleId 文章id
     * @return 详细信息
     */
    @GetMapping("/getArticleAllMessage")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson getArticleAllMessage(@RequestParam("articleId") Integer articleId) {
        return messageBoardService.getArticleAllMessage(articleId);
    }

    /**
     * 将 点赞 添加到通知给其他关联用户看
     *
     * @param praiseId 点赞id
     * @return 点赞信息
     */
    @PostMapping("/praiseNewToNotice")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson praiseNewToNotice(@RequestParam("praiseId") Integer praiseId) {
        MessageBoardPraise message = messageBoardService.getPraiseMessageByPraiseId(praiseId);
        try {
            messageBoardService.praiseNewToNotice(message);
            return new SimpleJson(0, "成功");
        } catch (Exception e) {
            return new SimpleJson(5, "错误信息：" + e.getMessage());
        }
    }

    /**
     * 将 评论 添加到通知给其他关联用户看
     *
     * @param commentId 评论id
     * @return 评论信息
     */
    @PostMapping("/commentNewToNotice")
    @PreAuthorize("hasAuthority('游客')")
    public SimpleJson commentNewToNotice(@RequestParam("commentId") Integer commentId) {
        MessageBoardCommentVo message = messageBoardService.getCommentMessageByCommentId(commentId);
        try {
            messageBoardService.commentNewToNotice(message);
            return new SimpleJson(0, "成功");
        } catch (Exception e) {
            return new SimpleJson(5, "错误信息：" + e.getMessage());
        }
    }
    /**
     * 在留言板界面用户删除自己的某篇文章
     *
     * @return 自己的全部文章
     */
    @DeleteMapping("/delUserArticleAtBoard")
    @PreAuthorize("hasAuthority('正式成员')")
    public SimpleJson delUserArticleAtBoard(@RequestParam("articleId") Integer articleId) {
        Integer userId = Integer.parseInt(JwtUtil.getUserForToken());
        try {
            messageBoardService.delArticleByArticleIdAndUserId(articleId, userId);
        } catch (Exception e) {
            return new SimpleJson(5, "错误信息：" + e.getMessage(), null);
        }
        return new SimpleJson(0,"删除成功");
    }
}
